import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;
import java.util.ArrayList;

// ノード集合のクラス
public class Nodes {
	private ArrayList<Node> list = null;
	private int serial = 0;

	public Nodes(){
		// オブジェクトの動的追加が可能なArrayListを利用
		list = new ArrayList<Node>();
	}

	// x,yの位置に新たなノードを追加
	public void addNode(double x, double y){
		list.add(new Node(serial, x, y));
		serial++;
	}

	public void addNode(double x, double y, double theta){
		list.add(new Node(serial, x, y));
		list.get(list.size()-1).setTheta(theta);
		serial++;
	}


	// リストのn(=0,1,..)番目のノードを取得
	public Node getNode(int n){
		if(n>=0 && n<getArrayListLength()){
			return list.get(n);
		}
		else
			return null;
	}

	// マウスでクリックしているノードのIDを返す．どこにも触っていないときは-1を返す．
	public int getTouchedNodeID(double x, double y){
		int ret = -1;
		for(int i=0; i<getArrayListLength(); i++){
			if(getNode(i).isContained(x, y)){
				ret = i;
			}
		}
		return ret;
	}

	// リストの長さを取得する
	public int getArrayListLength(){
		return list.size();
	}

	// リストの要素を削除する
	public void deleteNode(int id){
		list.remove(id);
	}


}


//ノード1個分のクラス
class Node {
	private Ellipse2D.Double np = null;
	private double theta = 0.0;
	private int serial;
	private double ini_width = 7.0;
	private boolean isSelected = false;
	private String nodeName = "-";

	public Node(int serial, double x, double y){
		this.serial = serial;
		np = new Ellipse2D.Double(x - 0.5*ini_width, y - 0.5*ini_width, ini_width, ini_width);
	}

	//グラフィック用のオブジェクト（円）を返す
	public Ellipse2D.Double getEllipse(){
		return np;
	}

	// 円の中心の位置を指定する
	public void setPosition(double x, double y){
		np.setFrame(x - 0.5*np.width, y - 0.5*np.height, np.width, np.height);
	}

	// 円の中心の位置を取得する
	public Point2D.Double getCenterPosition(){
		return new Point2D.Double(np.getCenterX(), np.getCenterY());
	}

	// 円の直径を指定する
 	public void setSize(double s){
		np.setFrame(np.x, np.y, s, s);
	}

	public boolean isContained(double x, double y){
		return np.contains(x, y);
	}

	public boolean getIsSelected(){
		return isSelected;
	}

	public void setSelected(boolean val){
		isSelected = val;
	}

	public void flipSelected(){
		if(isSelected==true)
			isSelected = false;
		else
			isSelected = true;
	}

	public void incrementPosition(double dx, double dy){
		setPosition(np.x + 0.5*np.width + dx, np.y + 0.5*np.height + dy);
	}

	public int getSerial(){
		return serial;
	}

	public void setName(String name){
		nodeName = name;
	}

	public String getName(){
		return nodeName;
	}

	public void setTheta(double theta){
		this.theta = theta;
	}

	public double getTheta(){
		return theta;
	}
}

